import Request from 'luch-request'

// 创建请求实例
const http = new Request({
  baseURL: 'http://localhost:8080/api',
  timeout: 10000,
  header: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
http.interceptors.request.use(
  (config) => {
    // 显示加载提示
    uni.showLoading({
      title: '加载中...',
      mask: true
    })
    
    // 添加token
    const token = uni.getStorageSync('token')
    if (token) {
      config.header.Authorization = `Bearer ${token}`
    }
    
    return config
  },
  (error) => {
    uni.hideLoading()
    return Promise.reject(error)
  }
)

// 响应拦截器
http.interceptors.response.use(
  (response) => {
    uni.hideLoading()
    
    const { data } = response
    
    // 请求成功
    if (data.code === 0 || data.code === 200) {
      return data
    }
    
    // Token失效
    if (data.code === 401) {
      uni.showToast({
        title: '登录已过期，请重新登录',
        icon: 'none'
      })
      
      // 清除token并跳转到登录页
      uni.removeStorageSync('token')
      uni.removeStorageSync('userInfo')
      
      setTimeout(() => {
        uni.reLaunch({
          url: '/pages/auth/login'
        })
      }, 1500)
      
      return Promise.reject(data)
    }
    
    // 其他错误
    uni.showToast({
      title: data.message || '请求失败',
      icon: 'none'
    })
    
    return Promise.reject(data)
  },
  (error) => {
    uni.hideLoading()
    
    console.error('请求错误:', error)
    
    let message = '网络异常，请检查网络连接'
    
    if (error.response) {
      switch (error.response.status) {
        case 400:
          message = '请求参数错误'
          break
        case 401:
          message = '未授权，请重新登录'
          break
        case 403:
          message = '禁止访问'
          break
        case 404:
          message = '请求地址不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = `请求失败，状态码：${error.response.status}`
      }
    } else if (error.request) {
      message = '网络连接超时'
    }
    
    uni.showToast({
      title: message,
      icon: 'none'
    })
    
    return Promise.reject(error)
  }
)

export { http }
export default http